package wechat

import (
	"code.gitea.io/gitea/modules/cache"
	"code.gitea.io/gitea/modules/json"
)

const (
	// KeyPrefix 缓存键前缀：微信公众号二维码 Ticket
	KeyPrefix = "wechat:official-account:qr:ticket:"
)

// SetWechatQrTicketWithTTL 设置 WeChat QR Ticket 与 VO JSON 的映射关系，并设置过期时间
func SetWechatQrTicketWithTTL(ticket, valueJSON string, ttl int) (ok bool) {
	keyStr := KeyPrefix + ticket

	err := cache.GetCache().Put(keyStr, valueJSON, int64(ttl))

	return err == nil
}

// 获取 WeChat QR Ticket 扫码状态（只读取状态、不删除）
func GetWechatQrStatusByTicket(ticket string) (*WechatTempQRStatus, error) {
	// 1. 将 ticket 与二维码缓存键拼接，作为 cache key 查询缓存
	keyStr := KeyPrefix + ticket
	wechatQrCacher := cache.GetCache()
	qrStatusJson, ok := wechatQrCacher.Get(keyStr)
	if !ok {
		return &WechatTempQRStatus{
			IsScanned: false,
		}, nil
	}

	// 2. 对缓存查询结果进行 JSON 反序列化为 VO 对象
	var qrStatus WechatTempQRStatus
	err := json.Unmarshal([]byte(qrStatusJson), &qrStatus)
	if err != nil {
		return nil, ErrorWechatTempQRStatus{
			Action:  "Convert QR Status",
			Message: err.Error(),
		}
	}
	return &qrStatus, nil
}

// DeleteWechatQrByTicket 通过 ticket 删除微信公众号临时二维码缓存记录
func DeleteWechatQrByTicket(ticket string) error {

	keyStr := KeyPrefix + ticket

	return cache.GetCache().Delete(keyStr)
}
